/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jjsoft.celularessuc.gco.rep;

import com.jjsoft.celularessuc.gco.dao.GenericController;
import com.jjsoft.celularessuc.gco.mdl.Cliente;
import com.jjsoft.celularessuc.gco.mdl.Factura;
import com.jjsoft.celularessuc.gco.mdl.Gasto;
import com.jjsoft.celularessuc.gco.mdl.Ingreso;
import com.jjsoft.celularessuc.gco.mdl.Proforma;
import com.jjsoft.celularessuc.gco.mdl.Serviciotecnico;
import com.jjsoft.celularessuc.gco.mdl.Sucursal;
import com.jjsoft.celularessuc.gco.mdl.Usuario;
import com.jjsoft.celularessuc.gco.neg.DiarioManager;
import com.jjsoft.celularessuc.gco.neg.FacturaManager;
import com.jjsoft.celularessuc.gco.neg.GastoManager;
import com.jjsoft.celularessuc.gco.neg.IngresoManager;
import com.jjsoft.celularessuc.gco.neg.ProformaManager;
import com.jjsoft.celularessuc.gco.neg.ServicioTecnicoManager;
import com.jjsoft.celularessuc.gco.ui.VDeudor;
import com.jjsoft.celularessuc.gco.util.configuraciones;
import com.mysql.jdbc.Connection;
import java.awt.Desktop;
import java.io.File;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;

/**
 *
 * @author wilo
 */
public class ReportePDF {

    public void generarPDF(String nombreReporte, String nombresalida) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conexion = (Connection) DriverManager.getConnection("jdbc:mysql://10.0.0.154:3306/celulares", "ppsis", "12345");
            try {
                JasperReport reporte = (JasperReport) JRLoader.loadObject("C:/celulares/" + nombreReporte);
                JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, conexion);

                JRExporter exporter = new JRPdfExporter();

                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("C:/celulares/" + nombresalida));
                exporter.exportReport();
                try {
                    File file = new File("C:/celulares/" + nombresalida);
                    Desktop.getDesktop().open(file);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (JRException ex) {
                Logger.getLogger(VDeudor.class.getName()).log(Level.SEVERE, null, ex);
            }
            conexion.close();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(VDeudor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(VDeudor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void RecuperarDocumentos(Date fecha1, Date fecha2, Sucursal sucursal) throws JRException {
        List datos = new ArrayList();
        String fechaIni = fecha1.toLocaleString().split(" ")[0];

        String fechafin = fecha2.toLocaleString().split(" ")[0];

        FacturaManager fm = new FacturaManager();
        List<Factura> listaFacturas;
        if (sucursal == null) {
            listaFacturas = fm.buscarPorFechas(fecha1, fecha2);
        } else {
            listaFacturas = fm.buscarPorFechas(fecha1, fecha2, sucursal);
        }

        ProformaManager pm = new ProformaManager();
        List<Proforma> listaProformas;
        if (sucursal == null) {
            listaProformas = pm.buscarPorFechas(fecha1, fecha2);
        } else {
            listaProformas = pm.buscarPorFechas(fecha1, fecha2, sucursal);
        }
        List<Serviciotecnico> listaServicio;
        ServicioTecnicoManager sm = new ServicioTecnicoManager();
        if (sucursal == null) {
            listaServicio = sm.buscarPorFechas(fecha1, fecha2);
        } else {
            listaServicio = sm.buscarPorFechas(fecha1, fecha2, sucursal);
        }

        double totalP = 0.0D;
        double totalF = 0.0D;
        double totalT = 0.0D;
        double totalS = 0.0D;

        for (Factura factura : listaFacturas) {
            if (factura.getEstado() == 0) {
                datos.add(new Documento(factura.getNumero(), factura.getFechaEmision(), factura.getTotal() + "", factura.getCedulaCliente().getCedula() + "", "Factura"));
                totalF += factura.getTotal().doubleValue();
            }
        }
        for (Proforma proforma : listaProformas) {
            if (proforma.getEstado() == 0) {
                datos.add(new Documento(proforma.getNumero(), proforma.getFechaEmision(), proforma.getTotal() + "", proforma.getCedulaCliente().getCedula() + "", "Proforma"));
                totalP += proforma.getTotal().doubleValue();
            }
        }
        for (Serviciotecnico servicio : listaServicio) {
            if (servicio.getEstado() == 1) {
                datos.add(new Documento(servicio.getIdServicioTecnico().intValue(), servicio.getFecha(), servicio.getPaga() + "", servicio.getCedulaCliente().getCedula() + "", "Servicio Técnico"));
                totalS += servicio.getPaga().doubleValue();
            }
        }

        totalT = totalP + totalF + totalS;
        Date d = new Date();
        String fecha = d.getDate() + "-" + (d.getMonth() + 1) + "-" + (d.getYear() + 1900);

        JasperReport reporte = (JasperReport) JRLoader.loadObject("C:/celularessuc/ReporteVentas.jasper");

        String suc = "TODAS";
        if (sucursal != null) {
            suc = sucursal.getNombre();
        }

        Map parametros = new HashMap();

        parametros.put("fecha", fecha);
        parametros.put("fechaI", fechaIni + "");
        parametros.put("fechaF", fechafin + "");
        parametros.put("totalF", getDecimal(2, totalF) + "");
        parametros.put("TotalP", getDecimal(2, totalP) + "");
        parametros.put("TotalS", getDecimal(2, totalS) + "");
        parametros.put("TotalT", getDecimal(2, totalT) + "");
        parametros.put("Sucursal", suc);

        JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, new JRBeanCollectionDataSource(datos));

        JRExporter exporter = new JRPdfExporter();
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("C:/celularessuc/ReporteVentas.pdf"));

        exporter.exportReport();
        try {
            File file = new File("C:/celularessuc/ReporteVentas.pdf");
            Desktop.getDesktop().open(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void ReporteCaja(Usuario usuario, Date fecha) throws JRException {
        List datos = new ArrayList();

        IngresoManager im = new IngresoManager();
        GastoManager gm = new GastoManager();
        DiarioManager dm = new DiarioManager();

        List<Ingreso> listaIngresos = im.listarIngresos(fecha, usuario);
        double totalI = 0.0D;
        for (int i = 0; i < listaIngresos.size(); i++) {
            String documento = "";
            if (listaIngresos.get(i).getNumDocumento() != null) {
                documento = " Documento: " + listaIngresos.get(i).getNumDocumento();
            }
            String fechaIng = ((Ingreso) listaIngresos.get(i)).getFecha().toLocaleString().split(" ")[0];
            datos.add(new IngresoEgreso(fechaIng, ((Ingreso) listaIngresos.get(i)).getHora(), ((Ingreso) listaIngresos.get(i)).getConcepto() + documento, String.valueOf(((Ingreso) listaIngresos.get(i)).getValor()), "Ingreso"));
            totalI += ((Ingreso) listaIngresos.get(i)).getValor().doubleValue();
        }

        List listaEgresos = gm.listarGastos(fecha, usuario);
        double totalE = 0.0D;
        for (int i = 0; i < listaEgresos.size(); i++) {
            String fechaEg = ((Gasto) listaEgresos.get(i)).getFecha().toLocaleString();
            datos.add(new IngresoEgreso(fechaEg, ((Gasto) listaEgresos.get(i)).getHora(), ((Gasto) listaEgresos.get(i)).getConcepto(), String.valueOf(((Gasto) listaEgresos.get(i)).getValor()), "Egreso"));
            totalE += ((Gasto) listaEgresos.get(i)).getValor().doubleValue();
        }

        double totalT = totalI - totalE;
        int numTransacciones = listaIngresos.size() + listaEgresos.size();
        Date d = new Date();
        String fecha2 = d.toLocaleString();

        JasperReport reporte = (JasperReport) JRLoader.loadObject("C:/celularessuc/ReporteCaja.jasper");

        Map parametros = new HashMap();
        parametros.put("RUC", usuario.getNick());
        parametros.put("fecha", fecha);
        parametros.put("fechaE", fecha2);
        parametros.put("totalF", getDecimal(2, totalI) + "");
        parametros.put("TotalP", getDecimal(2, totalE) + "");
        parametros.put("TotalT", getDecimal(2, totalT) + "");
        parametros.put("TotalTransacciones", numTransacciones + "");
        parametros.put("Sucursal", configuraciones.getInstance().getSucursal().getNombre());
        JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, new JRBeanCollectionDataSource(datos));

        JRExporter exporter = new JRPdfExporter();
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("C:/celularessuc/ReporteCaja.pdf"));
        try {
            exporter.exportReport();

            File file = new File("C:/celularessuc/ReporteCaja.pdf");
            Desktop.getDesktop().open(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void ReporteFacturaProforma(Cliente cliente) throws JRException {
         String cedula = cliente.getCedula();
         List datos = new ArrayList();
         
         FacturaManager fm = new FacturaManager();
         List<Factura> listaFacturas = fm.buscarPorCedula(cliente.getCedula());

         ProformaManager pm = new ProformaManager();
         List<Proforma> listaProformas = pm.buscarPorCedula(cliente.getCedula());

         ServicioTecnicoManager sm = new ServicioTecnicoManager();
         List<Serviciotecnico> listaServicioTecnico = sm.buscarPorCedula(cliente.getCedula());

         double totalP = 0.0D; double totalF = 0.0D; double totalT = 0.0D; double totalS = 0.0D;

         for (Factura factura : listaFacturas) {
            if (factura.getEstado() == 0) {
                datos.add(new Documento(factura.getNumero(), factura.getFechaEmision(), factura.getTotal() + "", factura.getCedulaCliente().getCedula() + "", "Factura"));
                totalF += factura.getTotal().doubleValue();
            }
        }
        for (Proforma proforma : listaProformas) {
            if (proforma.getEstado() == 0) {
                datos.add(new Documento(proforma.getNumero(), proforma.getFechaEmision(), proforma.getTotal() + "", proforma.getCedulaCliente().getCedula() + "", "Proforma"));
                totalP += proforma.getTotal().doubleValue();
            }
        }
        for (Serviciotecnico servicio : listaServicioTecnico) {
            if (servicio.getEstado() == 1) {
                datos.add(new Documento(servicio.getIdServicioTecnico().intValue(), servicio.getFecha(), servicio.getPaga() + "", servicio.getCedulaCliente().getCedula() + "", "Servicio Técnico"));
                totalS += servicio.getPaga().doubleValue();
            }
        }

         totalT = totalP + totalF + totalS;
         Date d = new Date();
         String fecha = d.getDate() + "-" + (d.getMonth() + 1) + "-" + (d.getYear() + 1900);

         JasperReport reporte = (JasperReport)JRLoader.loadObject("C:/celularessuc/Factura.jasper");

         Map parametros = new HashMap();
         parametros.put("RUC", cedula + "");
         parametros.put("nombre", cliente.getApellidos() + " " + cliente.getNombres());
         parametros.put("telefono", cliente.getTelefono());
         parametros.put("fecha", fecha);
         parametros.put("totalF", getDecimal(2, totalF) + "");
         parametros.put("TotalP", getDecimal(2, totalP) + "");
         parametros.put("TotalS", getDecimal(2, totalS) + "");
         parametros.put("TotalT", getDecimal(2, totalT) + "");

         JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, new JRBeanCollectionDataSource(datos));

         JRExporter exporter = new JRPdfExporter();
         exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
         exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("C:/celularessuc/FacturaProformaCliente.pdf"));

         exporter.exportReport();
         try
         {
         File file = new File("C:/celularessuc/FacturaProformaCliente.pdf");
         Desktop.getDesktop().open(file);
         } catch (Exception e) {
         e.printStackTrace();
         }

    }

    public double getDecimal(int numeroDecimales, double decimal) {
        decimal *= Math.pow(10.0D, numeroDecimales);
        decimal = Math.round(decimal);
        decimal /= Math.pow(10.0D, numeroDecimales);

        return decimal;
    }
}
